//
//  LSOauthViewModel.swift
//  新浪微博---01次
//
//  Created by 李宗帅 on 16/5/6.
//  Copyright © 2016年 LS. All rights reserved.
//

import UIKit

class LSOauthViewModel: NSObject {
    
    //单例对象 -- 设计模式
    
    //优点:只有一块内存区域
    //缺点:只有当程序Kill的时候 内存才会释放,一个地方更改其属性,其他地方再使用也会发生改变
    //创建了单例 就想所有的获取的就是这个单例 不再创建实例
    
    //定义一个Model属性
    var userAccout:LSUserAccount?
    
    static let shareInstance: LSOauthViewModel = LSOauthViewModel()

    
    var isLogin: Bool{
        get{
            
            return userAccout?.access_token != nil
        }
        
        
    }
    
    //只实现了get方法 相当于OC里面的只读属性  在swfit中叫计算型属性
    //只实现set方法 叫存储型属性
    //存储型属性和计算型属性对比
    //存储型属性1.可以存储数据,2.开辟内存空间3.消耗内存
    //计算型属性1.不能存储,2.不需要开辟空间.相当于一个函数,3.计算性属性大多和其他属性配合使用,4.不消耗内存,但是消耗cpu 
    //下边这种写法是简写的get方法
    var access_token: String? {
        return userAccout?.access_token
    }
    //view一创建好就要有值  那么在init的时候就让userAccount 去读取数据 重写init
    private override init() {
        super.init()
        
        userAccout = LSUserAccount.readUserAccont()
    }

    func loadToken(code: String,sucess: ()->(),failed: ()->()){
        let urlString =  "https://api.weibo.com/oauth2/access_token"
        //        接口文档 的内容，可以复制到这里,方便我们拼接参数
        //        client_id	true	string	申请应用时分配的AppKey。
        //        client_secret	true	string	申请应用时分配的AppSecret。
        //        grant_type	true	string	请求的类型，填写authorization_code
        //
        //        grant_type为authorization_code时
        //        必选	类型及范围	说明
        //        code	true	string	调用authorize获得的code值。
        //        redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致
        let parameters = ["client_id":AppKey,"client_secret":AppSecret,"grant_type":"authorization_code","code":code,"redirect_uri":AppRedictUrl]
        
        LSHTTPClicent.shareInstance.request(LSHTTPClientType.POST, URLString: urlString, parameters: parameters, success: { (_, JSON) -> Void in
            printLog(JSON)
            
            //as  as? as!  数据转模型
            //既然JSON是可选,那么我们需要判断一下是否有值
            if let json = JSON as? [String:AnyObject] {
                let model = LSUserAccount(dic: json)
                
                self.loadInfo(model, success: sucess, failed: failed)
                
            }
            
            }) { (_, error) -> Void in
                //failed: unacceptable content-type: text/plain  这种错误代表请求返回的数据不能识别这种类型,那我们就需要在返回请求的方法内添加识别这种类型
                failed()
        }
        
    }
    
    
    private func loadInfo(model: LSUserAccount,success: ()->(),failed:()->()){
        guard let uid = model.uid, let token = model.access_token else {
            return
        }
        
        let urlString = "https://api.weibo.com/2/users/show.json"
        
        //        access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
        //        uid	false	int64	需要查询的用户ID。
        //        screen_name	false	string	需要查询的用户昵称。
        
        let parameters = ["access_token":token,"uid":uid]
        
        LSHTTPClicent.shareInstance.request(LSHTTPClientType.GET, URLString: urlString, parameters: parameters, success: { (_, JSON) -> Void in
            
            printLog(JSON)
            if let json = JSON as? [String: AnyObject]{
                
                let name = json["screen_name"] as? String
                model.screen_name = name
                
                model.profile_image_url = json["profile_image_url"] as? String
                
                printLog(model.profile_image_url)
                
                // 进行一个归档
                // 1. 获取沙盒路径
                let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
                // 2. 拼接文件的路径
                // swift 中的String 可以灵活的转换成 NSSring，转换之后可以掉用OC里 的方法
                let filePath = (path as NSString).stringByAppendingPathComponent("info.aaa")
                // 3.
                NSKeyedArchiver.archiveRootObject(model, toFile: filePath)
                
                
                //把modele赋值给UserAccont
                self.userAccout = model
                // 归档完成，授权界面消失，切换了视图控制器
                //                self.dismiss()
                success()
                
            }
            
            }) { (_ , error) -> Void in
                printLog(error )
                failed()
        }
    }


}
